<?php

namespace Common\Model;

use Think\Model;

/**
 * 团体模型
 */
class OrgModel extends Model {

    const NORMAL = 0;   // 团体状态：正常
    const DELTEL = -1;  // 团体状态：删除

    const ORG_KEY = 'org:';     // 团体详细信息的缓存键名
    const ORG_INDEX_KEY = 'indexorg:c:';  // 团体展示缓存（缓存时间为60分钟）

    /**
     * 向Org表中新增一条数据
     * @param $data
     * @return mixed
     */
    public static function addOrg($data){
        return M('Org')->add($data);
    }

    /**
     * 用户创建团体
     * @param $uid
     * @param $gx
     * @param $data
     * @return bool|mixed 如果创建成功返回团体ID
     */
    public static function createOrg($uid, $gx, $data){
        $model = M();
        $model->startTrans();
        // 先减少用户的贡献度
        $result = UserModel::updateGx($uid, $gx, false);
        if(!$result){
            $model->rollback();
            return false;
        }
        // 然后添加团体信息
        $bid = self::addOrg($data);
        if(!$bid){
            $model->rollback();
            return false;
        }
        // 再添加团体计数数据
        $res = OrgCountModel::addOrgCount($bid, $gx);
        if(!$res){
            $model->rollback();
            return false;
        }
        // 最后添加关系数据
        $id = UserOrgModel::addData($uid, $bid);
        if(!$id){
            $model->rollback();
            return false;
        }
        // 最后添加用户捐赠记录
        if(!LogModel::donate($uid, $bid, 0, $gx)){
            $model->rollback();
            return false;
        }
        $model->commit();
        return $bid;
    }

    /**
     * 获取指定团体的所有信息
     * @param $bid
     * @return mixed
     */
    public static function getOrgById($bid){
        $key = self::ORG_KEY.$bid;
        $result = S($key);
        if($result){
            return array_merge($result, OrgCountModel::getOrgCountById($bid));
        }
        $result = M()->table(array('wo_org' => 'o', 'wo_org_count' => 'c'))->where(array('o.id' => $bid))->where('o.id = c.id')->find();
        if($result){
            $res = splitArray($result, 'gx,focus,tz,hf');
            S($key, $res[0]);
            OrgCountModel::addOrgCountCache($bid, $res[1]);
        }
        return $result;
    }

    /**
     * 获取团体信息[仅获取Org表中的数据，不获取Org_count表中的数据]
     * @param $bid
     * @return mixed
     */
    public static function getSimpleOrgById($bid){
        $key = self::ORG_KEY.$bid;
        $result = S($key);
        if(!$result){
            $result = M('Org')->find($bid);
            if($result){
                S($key, $result);
            }
        }
        return $result;
    }

    /**
     * 根据团体ID数组批量获取多个团体信息并写入缓存[仅获取Org表中的数据，不获取Org_count表中的数据]
     * @param $search
     * @return mixed
     */
    public static function getSimpleOrgByList($search){
        $result = M('Org')->where(array('id' => array('in', $search)))->select();
        if($result){
            // 批量写入缓存
            foreach($result as $k => $v){
                S(self::ORG_KEY.$v['id'], $v);
            }
        }
        return $result;
    }

    /**
     * 团体管理员更新团体信息
     * @param $bid
     * @param $data
     * @return bool
     */
    public static function updateOrg($bid, $data){
        $result = M('Org')->where(array('id' => $bid))->save($data);
        if($result){
            self::clearCache($bid);
        }
        return $result;
    }

    /**
     * 清除团体缓存数据，以待下次获取数据时刷新缓存
     * @param $bid
     */
    public static function clearCache($bid){
        $key = self::ORG_KEY.$bid;
        S($key, null);
    }

}